package designPattern.creation.singletonpattern;

/**
 * 懒汉式单例 -- 在第一次调用的时候实例化
 * @author 张琪
 * @date 2023/1/29 16:42
 */
public class Singleton {

    private String name = "懒汉式单例 - 线程安全1 -- 同步锁";

    /**
     * 私有化构造方法, 外部无法调用;
     */
    private Singleton(){}

    /**
     * 单例对象; 设置初始值为 null,
     */
    private static Singleton single = null;

    /**
     * 静态工厂方法(因为私有化构造方法, 所以单例类中获取实例的方法必须为静态方法才能供外部调用)<br/>
     * 线程不安全
     * @return 单例对象
     */
    public static Singleton getInstance(){
        if (single == null) {
            return new Singleton();
        }
        return single;
    }

    /**
     * 使用 {@code synchronized} 关键字保证线程安全 <br/>
     * 缺点: 每次都要同步, 影响效率;(99%情况不需要同步) -- 更新 token
     * @return 单例对象
     */
    public static synchronized Singleton getSafeInstance1() {
        if (single == null) {
            return new Singleton();
        }
        return single;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
